#ifndef CURRSENSE_H
#define CURRSENSE_H

#include "driver/adc.h"
#include "esp_adc_cal.h"

/**
 * @brief 特殊标记，表示未启用的 ADC 通道（用于未连接 C 相）
 */
#define NOT_SET_CH ((adc1_channel_t)-1)

/**
 * @brief 判断 ADC 通道是否合法
 */
#define IS_VALID_CH(a) ((a) >= 0 && (a) < ADC1_CHANNEL_MAX)

/**
 * @brief 电流检测结构体，封装了 ADC 通道、校准偏移、增益参数和实时电流值
 */
typedef struct {
    // ADC 通道（A/B/C 相）
    adc1_channel_t pinA;
    adc1_channel_t pinB;
    adc1_channel_t pinC;  // 可选（未启用时设为 NOT_SET_CH）

    // 零漂偏移值（空载电压）
    float offset_ia;
    float offset_ib;
    float offset_ic;

    // 电流增益参数（V -> A）
    float gain_a;
    float gain_b;
    float gain_c;

    // 实时计算的电流值（单位：A）
    float current_a;
    float current_b;
    float current_c;

    // 电路参数
    float shunt_resistor;       // 分流电阻 (单位 Ω)
    float amp_gain;             // 放大器增益
    float volts_to_amps_ratio;  // 电压转电流比率 = 1 / (R * G)
} CurrSense;

/**
 * @brief 初始化电流采集结构体（设置通道、增益、执行ADC配置与校准）
 * @param cs CurrSense 对象指针
 * @param mot_num 电机编号（0/1），用于选择不同 ADC 通道
 */
void currsense_init(CurrSense* cs, int mot_num);

/**
 * @brief 配置 ADC 模块（分辨率、衰减）
 * @param cs CurrSense 对象指针
 */
void currsense_configure_adc(CurrSense* cs);

/**
 * @brief 读取指定 ADC 通道的电压值（单位：V）
 * @param cs CurrSense 对象指针
 * @param channel ADC 通道
 * @return float 电压值（0~3.3V）
 */
float currsense_read_voltage(CurrSense* cs, adc1_channel_t channel);

/**
 * @brief 对 ADC 通道执行零漂校准（在无电流时测量平均电压）
 * @param cs CurrSense 对象指针
 */
void currsense_calibrate(CurrSense* cs);

/**
 * @brief 获取三相电流值，存储在结构体中（单位 A）
 *        如果未启用 C 相，则通过 Ia + Ib + Ic = 0 推导出 Ic
 * @param cs CurrSense 对象指针
 */
void currsense_get_currents(CurrSense* cs);

#endif
